//构造函数实现通用属性和方法，new实例方法继承构造函数的属性和方法
function SuperFun (name,age) {
    // 公共的属性
    this.name = name
    this.age = age
    this.has = ['头发','眼睛','鼻子']
}
// 公共方法
SuperFun.prototype.getSuperValue = function () {
    console.log('都有'+this.has);
    console.log(this.age+'岁'+this.name+'在晨跑锻炼');
}

// 原型链继承，其实就是通过prototype原型属性的方式继承父类
function SubFun (name,age,address) {
    //  通过拷贝父类属性
    SuperFun.call(this,name,age)
    this.address = address
}
SubFun.prototype = new SuperFun()  //原型链继承
// console.log(SubFun.prototype.constructor); //指向SuperFun
// 重写SubFun.prototype的constructor属性，指向自己的构造函数SubFun
SubFun.prototype.constructor = SubFun
// console.log(SubFun.prototype.constructor); //指向SuperFun
// 实例对象
let zhangsan = new SubFun('张三',11,'江西省上饶市')
zhangsan.getSuperValue()  //都有头发,眼睛,鼻子
zhangsan.has.push('大长腿')
console.log(zhangsan.has); //头发 眼睛 鼻子 大长腿
console.log(zhangsan.address);
let lisi = new SubFun('李四',10,'上海市浦东新区')
lisi.getSuperValue()  //都有头发,眼睛,鼻子
lisi.has.push('乌黑头发')
console.log(lisi.has); //头发 眼睛 鼻子 乌黑头发
console.log(lisi.address);
